Que son las expresiones regulares

Expresión regular, también conocida como regex, regexp o expresión racional, es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones.

Teoría

Las expresiones regulares se construyen utilizando los operadores unión, concatenación y clausura de Kleene.

La clausura de Kleene : es una operación que se aplica sobre un conjunto de cadenas de caracteres o un conjunto de símbolos o caracteres, y representa el conjunto de las cadenas que se pueden formar tomando cualquier número de cadenas del conjunto inicial, posiblemente con repeticiones, y concatenados entre sí.

Cuantificadores

Un Cuantificador que precede a un carácter cuantifica las veces que este carácter puede aparecer.

  • ? El carácter que precede puede aparecer como mucho una vez.
  • + El carácter que le precede debe aparecer al menos una vez.
  • * El carácter que le precede puede aparecer cero, una, o más veces.
  • {} Las llaves juegan el papel de meta caracteres, para que cumplan su funcionalidad deben estar después de la expresión regular y encierran uno o varios números.
    • {n} Indica que coincide n veces.
    • {n,} Indica que coincide más n veces.
    • {,n} Indica que coincide hasta n veces.
    • {n,m} Indica que coincide más n veces y menos de m veces.

Alternación

  • $ El signo de dólar representa el final de la cadena de caracteres o el final de la línea.

  • ^ El acento representa el inicio de la cadena.

Agrupación

  • () Los paréntesis son usados para la aplicación de operadores sobre más de un carácter.

  • [] Los corchetes agrupan caracteres en grupos o clases. Son útiles cuando es necesario buscar uno de un grupo de caracteres.
    • [a-z] Especifica un rango de caracteres.
    • [^.... ] Lista de caracteres excluidos
  • | Una barra vertical separa las alternativas. Realiza el papel de o.

  • . El punto busca cualquier carácter sin incluir los saltos de línea.

Barra invertida

Se utiliza para escapar el siguiente carácter de la expresión de búsqueda de forma que este adquiera un significado especial o deje de tenerlo.

  • \a — Representa una “campana” o “beep” que se produce al imprimir este carácter.
  • \e — Representa la tecla “Esc” o “Escape”

  • \x — Se utiliza para representar caracteres ASCII o ANSI si conoce su código. De esta forma, si se busca el símbolo de derechos de autor y la fuente en la que se busca utiliza el conjunto de caracteres Latin-1 es posible encontrarlo utilizando “9”.
  • \d — Representa un dígito del 0 al 9.
  • \w — Representa cualquier carácter alfanumérico.
  • \s — Representa un espacio en blanco.
  • \D — Representa cualquier carácter que no sea un dígito del 0 al 9.
  • \W — Representa cualquier carácter no alfanumérico.
  • \S — Representa cualquier carácter que no sea un espacio en blanco.
  • \A — Representa el inicio de la cadena. No un carácter sino una posición.
  • \Z — Representa el final de la cadena. No un carácter sino una posición.
  • \b — Marca la posición de una palabra limitada por espacios en blanco, puntuación o el inicio/final de una cadena.
  • \B — Marca la posición entre dos caracteres alfanuméricos o dos no-alfanuméricos.

El signo de admiración

  • ! El signo de admiración representa una búsqueda negativa, en otras palabras que no incluya la palabra que especificamos.

Metacaracteres especiales

  • \t — Representa un tabulador.
  • \r — Representa el “retorno de carro” o “regreso al inicio” o sea el lugar en que la línea vuelve a iniciar.
  • \n — Representa la “nueva línea” el carácter por medio del cual una línea de inicio.
  • \f — Representa un salto de página
  • \v — Representa un tabulador vertical

Otras representaciones

  • [:digit:] <- Digitos del 0 al 9.
  • [:lower:] <- Letras en monuscula
  • [:upper:] <- Letras mayusculas
  • [:alpha:] <- Caractes alfabeticos
  • [:alnum:] <- Digitos y caracteres alfanumerico
  • [:punct:] <- Puntuación
  • [:graph:] <- Caracter graficos [:alnum:] y [:punct:]
  • [:blank:] <- Caracter en blanco espacio y tabulador
  • [:space:] <- Caracteres de espacios : espacio, tabulador, nueva linea y otros caracteres de espacio.
  • [:print:] <- Caracteres imprimibles: [:alnum:], [:punct:] y [:space:].

Implementación en R

library(stringr)
library(XML)
## Warning: package 'XML' was built under R version 3.5.2
library(RCurl)
## Warning: package 'RCurl' was built under R version 3.5.2
## Loading required package: bitops
string <- c("R es el mejor lenguaje", " Es un lenguaje vectorizado",
            " Es muy bueno en analítica")
patron <- '(R|lenguaje)'

Detección del patron.

# Da la posición de las fraces que contienen el patron
grep(pattern = patron, string) 
## [1] 1 2
# Extrae las oraciones que contienen el patron
grep(pattern = patron, string, value = T)
## [1] "R es el mejor lenguaje"      " Es un lenguaje vectorizado"
# valores logicos
grepl(pattern = patron, string)
## [1]  TRUE  TRUE FALSE
stringr::str_detect(pattern = patron, string)
## [1]  TRUE  TRUE FALSE

División de un strig usando un patron

strsplit(string, patron)
## [[1]]
## [1] ""              " es el mejor "
## 
## [[2]]
## [1] " Es un "      " vectorizado"
## 
## [[3]]
## [1] " Es muy bueno en analítica"
stringr::str_split(string, patron)
## [[1]]
## [1] ""              " es el mejor " ""             
## 
## [[2]]
## [1] " Es un "      " vectorizado"
## 
## [[3]]
## [1] " Es muy bueno en analítica"

Localización del patron

stringr::str_locate(string , patron)
##      start end
## [1,]     1   1
## [2,]     8  15
## [3,]    NA  NA
stringr::str_locate_all(string , patron)
## [[1]]
##      start end
## [1,]     1   1
## [2,]    15  22
## 
## [[2]]
##      start end
## [1,]     8  15
## 
## [[3]]
##      start end

Extraer patron

# Extraer solo las primeras coincidencias
regmatches(string, regexpr(patron, string))
## [1] "R"        "lenguaje"
#Extraer todas las conincidencias
regmatches(string, gregexpr(patron, string))
## [[1]]
## [1] "R"        "lenguaje"
## 
## [[2]]
## [1] "lenguaje"
## 
## [[3]]
## character(0)
# Extraer solo las primeras coincidencias
stringr::str_extract(string , patron)
## [1] "R"        "lenguaje" NA
# Extraer solo las primeras coincidencias en una lista
stringr::str_extract_all(string , patron)
## [[1]]
## [1] "R"        "lenguaje"
## 
## [[2]]
## [1] "lenguaje"
## 
## [[3]]
## character(0)
# Extraer solo las primeras coincidencias en una matriz
stringr::str_extract_all(string , patron, simplify = T)
##      [,1]       [,2]      
## [1,] "R"        "lenguaje"
## [2,] "lenguaje" ""        
## [3,] ""         ""

Reemplazar patron

# Reemplaza la primera coincidencia
sub(patron, c("python"), string)
## [1] "python es el mejor lenguaje" " Es un python vectorizado"  
## [3] " Es muy bueno en analítica"
# Reemplaza todas las coincidencias
gsub(patron, c("python"), string)
## [1] "python es el mejor python"  " Es un python vectorizado" 
## [3] " Es muy bueno en analítica"
# Reemplaza la primera coincidencia
stringr::str_replace(string, patron, "python")
## [1] "python es el mejor lenguaje" " Es un python vectorizado"  
## [3] " Es muy bueno en analítica"
# Reemplaza todas las coincidencias
stringr::str_replace_all(string, patron, "python")
## [1] "python es el mejor python"  " Es un python vectorizado" 
## [3] " Es muy bueno en analítica"

Ejemplos

Supongamos que se ha recopilado una serie de nombres y número de telefonos de los personajes de ficcion de los “simpson”. La proposito es extrarer los nombres y los numeros y ponerlos en un data frame.

hileras <- "555-1230Moe Szyslak(636) 555-0113Burns, C. Montgomery555-6542Rev. Timothy Lovejoy555 8904Ned Flander636-555-3226Simpson, Homer5543642Dr. Julius Hibbert"


# Estraer información
# str_extract_all <-  Extrae porciones de texto del string
# unlist <-  para que no lo retorne como un lista
nombre <- unlist(str_extract_all(hileras, "[[:alpha:]., ]{2,}"))
nombre
## [1] "Moe Szyslak"          "Burns, C. Montgomery" "Rev. Timothy Lovejoy"
## [4] "Ned Flander"          "Simpson, Homer"       "Dr. Julius Hibbert"
#
telefono <- unlist(str_extract_all(hileras, "\\(?(\\d{3})?\\)?(-| )?\\d{3}(-| )?\\d{4}"))
telefono
## [1] "555-1230"       "(636) 555-0113" "555-6542"       "555 8904"      
## [5] "636-555-3226"   "5543642"
data.frame(Nombre = nombre, Telefono = telefono)
##                 Nombre       Telefono
## 1          Moe Szyslak       555-1230
## 2 Burns, C. Montgomery (636) 555-0113
## 3 Rev. Timothy Lovejoy       555-6542
## 4          Ned Flander       555 8904
## 5       Simpson, Homer   636-555-3226
## 6   Dr. Julius Hibbert        5543642
hilera <- "La 1 Prueba  de expresiones- - y. Otras cosas."
str_extract(hilera, "texto")
## [1] NA
str_extract_all(hilera, "^1")
## [[1]]
## character(0)
str_extract_all(hilera, "1")
## [[1]]
## [1] "1"
str_extract_all(hilera, "cosas.$")
## [[1]]
## [1] "cosas."
str_extract_all(hilera, "cosas.")
## [[1]]
## [1] "cosas."
str_extract_all(hilera, "Prueba|Otras")
## [[1]]
## [1] "Prueba" "Otras"
str_extract_all(hilera, "Pru.ba")
## [[1]]
## [1] "Prueba"
str_extract_all(hilera, "Pru[aeiou]ba") # alguno de todos
## [[1]]
## [1] "Prueba"
str_extract_all(hilera, "Pru[a-z]ba")
## [[1]]
## [1] "Prueba"
str_extract_all(hilera, "[ac.t ]")
## [[1]]
##  [1] "a" " " " " "a" " " " " " " " " " " "." " " "t" "a" " " "c" "a" "."
str_extract_all(hilera, "Pru[a-h]ba")
## [[1]]
## [1] "Prueba"
str_extract_all(hilera, "[:digit:]")
## [[1]]
## [1] "1"
str_extract_all(hilera, "[[:punct:]]" )
## [[1]]
## [1] "-" "-" "." "."
str_extract_all(hilera, "[[:lower:]]" )
## [[1]]
##  [1] "a" "r" "u" "e" "b" "a" "d" "e" "e" "x" "p" "r" "e" "s" "i" "o" "n"
## [18] "e" "s" "y" "t" "r" "a" "s" "c" "o" "s" "a" "s"
hilera1 <- " Texto de prueba para practica"
str_extract(hilera1 ,"Texto de pr[:alpha:]+ba para practica")
## [1] "Texto de prueba para practica"
# Los caracteres especiales se denotan por \\
# Extraer todos los . que aparecen 
str_extract_all(hilera, "\\.")
## [[1]]
## [1] "." "."

Herramientas